"""
增删改查

- 全部都是 db.session 操作
- 常见方法：
    - db.session.add(obj) 添加单个对象
    - db.session.add_all([obj1, obj2]) 添加多个对象
    - db.session.delete(obj) 删除单个对象
    - db.session.commit() 提交会话
    - db.drop_all() 删除继承自 db.Model 的所有表
    - db.create_all() 创建继承自 db.Model 的所有表
    - db.session.rollback() 回滚
    - db.session.remove() 移除会话

- 如果想要打印一个对象的时候想看到指定信息，那么请重写 __repr__ 方法
"""

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 2. 设置数据库的配置信息
# mysql://[用户名]:[密码]@[主机地址][端口号]/[数据库名]
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@127.0.0.1:3306/data36"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False


# 3. 创建 sqlalchemy 对象 db，关联 app
db = SQLAlchemy(app)


# 4. 编写模型类，继承自 db.Model
# 角色【一方】
class Role(db.Model):  # 默认表名为 student
    # 【主键】 参数1：表示 id 的类型；参数2：表示 id 的约束类型
    __tablename__ = "roles"  # 手动设置表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))


# 用户【多方】
class User(db.Model):  # 默认表名为 student
    # 【主键】 参数1：表示 id 的类型；参数2：表示 id 的约束类型
    __tablename__ = "users"  # 手动设置表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    # 建立外键
    role_id = db.Column(db.Integer, db.ForeignKey(Role.id))


@app.route("/")
def helloworld():
    return "hello world Flask"


def add():
    role = Role(name="role")
    db.session.add(role)
    db.session.commit()
    user = User(name="user", role_id=role.id)
    db.session.add(user)
    db.session.commit()


if __name__ == "__main__":
    # 创建数据库的表，创建的是继承自 db.Model 的表
    with app.app_context():
        # 创建所有继承自db.Model的表
        db.create_all()
        # 删除所有继承自db.Model的表
        # db.drop_all()

        add()
    app.run(debug=True)
